package com.nnnu.wsnackshop.service;

import com.nnnu.wsnackshop.pojo.dto.RiderDTO;
import com.nnnu.wsnackshop.pojo.dto.RiderLoginDTO;
import com.nnnu.wsnackshop.pojo.entity.Riders;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nnnu.wsnackshop.pojo.vo.RiderStatsVO;
import com.nnnu.wsnackshop.pojo.vo.RiderVO;
import com.nnnu.wsnackshop.result.PageResult;

import java.util.Map;

/**
 * <p>
 * 骑手表 服务类
 * </p>
 *
 * @author zk
 * @since 2025-05-14
 */
public interface IRidersService extends IService<Riders> {

    /**
     * 骑手登录
     *
     * @param loginDTO 登录信息
     * @return JWT token
     */
    String login(RiderLoginDTO loginDTO);

    /**
     * 自动分配骑手
     *
     * @param orderId 订单ID
     * @param storeId 店铺ID
     * @return 分配的骑手ID，如果没有可用骑手则返回null
     */
    Integer autoAssignRider(Long orderId, Integer storeId);

    /**
     * 手动分配骑手
     *
     * @param orderId 订单ID
     * @param riderId 骑手ID
     * @return 是否分配成功
     */
    boolean manualAssignRider(Long orderId, Integer riderId);

    /**
     * 骑手接单
     *
     * @param riderId 骑手ID
     * @param orderId 订单ID
     * @return 是否接单成功
     */
    boolean acceptOrder(Integer riderId, Long orderId);

    /**
     * 骑手确认送达
     *
     * @param riderId 骑手ID
     * @param orderId 订单ID
     * @return 是否确认成功
     */
    boolean confirmDelivery(Integer riderId, Long orderId);

    /**
     * 更新骑手状态
     *
     * @param riderId 骑手ID
     * @param status  状态：0=离线, 1=可用, 2=忙碌
     * @return 是否更新成功
     */
    boolean updateRiderStatus(Integer riderId, Integer status);

    /**
     * 获取骑手订单列表
     *
     * @param riderId  骑手ID
     * @param status   状态：pending=待接单, delivering=配送中, completed=已送达
     * @param page     页码
     * @param pageSize 每页条数
     * @return 订单列表
     */
    PageResult<Map<String, Object>> getRiderOrders(Integer riderId, String status, int page, int pageSize);

    /**
     * 获取骑手详情
     *
     * @param riderId 骑手ID
     * @return 骑手详情
     */
    RiderVO getRiderDetail(Integer riderId);

    /**
     * 添加骑手
     *
     * @param riderDTO 骑手信息
     * @return 添加的骑手
     */
    Riders addRider(RiderDTO riderDTO);

    /**
     * 更新骑手信息
     *
     * @param riderDTO 骑手信息
     * @return 是否更新成功
     */
    boolean updateRider(RiderDTO riderDTO);

    /**
     * 获取骑手配送历史
     *
     * @param riderId   骑手ID
     * @param timeRange 时间范围：today=今日, week=本周, month=本月, all=全部
     * @param page      页码
     * @param pageSize  每页条数
     * @return 配送历史
     */
    PageResult<Map<String, Object>> getRiderDeliveryHistory(Integer riderId, String timeRange, int page, int pageSize);

    /**
     * 获取骑手统计数据
     *
     * @param riderId 骑手ID
     * @return 统计数据
     */
    RiderStatsVO getRiderStats(Integer riderId);

    /**
     * 获取骑手列表（分页）
     *
     * @param page     页码
     * @param pageSize 每页大小
     * @param name     骑手姓名（可选筛选条件）
     * @param phone    骑手电话（可选筛选条件）
     * @return 骑手列表分页结果
     */
    PageResult<RiderVO> getRiderList(int page, int pageSize, String name, String phone);

    /**
     * 获取可用骑手ID
     *
     * @param storeId 店铺ID
     * @return 可用骑手ID，如果没有可用骑手则返回null
     */
    Integer getAvailableRider(Integer storeId);
}
